From 0dc81b9a35c982444a47c4097211e2254d711511 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 2 Aug 2010 15:26:41 +0200 Subject: [PATCH] GtkStyleSet: Allow setting default value when registering properties. This is now used for the "engine" keyword, where the default engine is used if none is specified. --- gtk/gtkstyleset.c | 58 +++++++++++++++++++++++++++++++++++------------ gtk/gtkstyleset.h | 3 ++- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/gtk/gtkstyleset.c b/gtk/gtkstyleset.c index f1e3f342ba..15db395a00 100644 --- a/gtk/gtkstyleset.c +++ b/gtk/gtkstyleset.c @@ -38,6 +38,7 @@ struct PropertyNode { GQuark property_quark; GType property_type; + GValue default_value; }; struct PropertyData @@ -66,19 +67,24 @@ static void gtk_style_set_class_init (GtkStyleSetClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + GValue val = { 0 }; object_class->finalize = gtk_style_set_finalize; /* Initialize default property set */ - gtk_style_set_register_property ("foreground-color", GDK_TYPE_COLOR); - gtk_style_set_register_property ("background-color", GDK_TYPE_COLOR); - gtk_style_set_register_property ("text-color", GDK_TYPE_COLOR); - gtk_style_set_register_property ("base-color", GDK_TYPE_COLOR); + gtk_style_set_register_property ("foreground-color", GDK_TYPE_COLOR, NULL); + gtk_style_set_register_property ("background-color", GDK_TYPE_COLOR, NULL); + gtk_style_set_register_property ("text-color", GDK_TYPE_COLOR, NULL); + gtk_style_set_register_property ("base-color", GDK_TYPE_COLOR, NULL); + + gtk_style_set_register_property ("font", PANGO_TYPE_FONT_DESCRIPTION, NULL); - gtk_style_set_register_property ("font", PANGO_TYPE_FONT_DESCRIPTION); + gtk_style_set_register_property ("padding", GTK_TYPE_BORDER, NULL); - gtk_style_set_register_property ("padding", GTK_TYPE_BORDER); - gtk_style_set_register_property ("engine", GTK_TYPE_THEMING_ENGINE); + g_value_init (&val, GTK_TYPE_THEMING_ENGINE); + g_value_set_object (&val, (GObject *) gtk_theming_engine_load (NULL)); + gtk_style_set_register_property ("engine", GTK_TYPE_THEMING_ENGINE, &val); + g_value_unset (&val); g_type_class_add_private (object_class, sizeof (GtkStyleSetPrivate)); } @@ -180,7 +186,8 @@ property_node_lookup (GQuark quark) /* Property registration functions */ void gtk_style_set_register_property (const gchar *property_name, - GType type) + GType type, + const GValue *default_value) { PropertyNode *node, new = { 0 }; GQuark quark; @@ -206,6 +213,12 @@ gtk_style_set_register_property (const gchar *property_name, new.property_quark = quark; new.property_type = type; + if (default_value) + { + g_value_init (&new.default_value, G_VALUE_TYPE (default_value)); + g_value_copy (default_value, &new.default_value); + } + for (i = 0; i < properties->len; i++) { node = &g_array_index (properties, PropertyNode, i); @@ -516,8 +529,10 @@ gtk_style_set_get_property (GtkStyleSet *set, if (G_IS_VALUE (&prop->values[state])) val = &prop->values[state]; - else + else if (G_IS_VALUE (&prop->default_value)) val = &prop->default_value; + else + val = &node->default_value; g_return_val_if_fail (G_IS_VALUE (val), FALSE); @@ -565,7 +580,7 @@ gtk_style_set_get_valist (GtkStyleSet *set, prop = g_hash_table_lookup (priv->properties, GINT_TO_POINTER (node->property_quark)); - if (!prop) + if (!prop && !G_IS_VALUE (&node->default_value)) { GValue *empty_value = { 0 }; @@ -578,10 +593,15 @@ gtk_style_set_get_valist (GtkStyleSet *set, { GValue *val; - if (G_IS_VALUE (&prop->values[state])) - val = &prop->values[state]; + if (prop) + { + if (G_IS_VALUE (&prop->values[state])) + val = &prop->values[state]; + else if (G_IS_VALUE (&prop->default_value)) + val = &prop->default_value; + } else - val = &prop->default_value; + val = &node->default_value; if (G_VALUE_TYPE (val) == GTK_TYPE_SYMBOLIC_COLOR) { @@ -724,8 +744,13 @@ gtk_style_set_merge (GtkStyleSet *set, if (replace || G_VALUE_TYPE (&prop->values[i]) == G_TYPE_INVALID) { - if (G_VALUE_TYPE (&prop->values[i]) == G_TYPE_INVALID) + if (!G_IS_VALUE (&prop->values[i])) g_value_init (&prop->values[i], G_VALUE_TYPE (&prop_to_merge->values[i])); + else if (G_VALUE_TYPE (&prop->values[i]) != G_VALUE_TYPE (&prop_to_merge->values[i])) + { + g_value_unset (&prop->values[i]); + g_value_init (&prop->values[i], G_VALUE_TYPE (&prop_to_merge->values[i])); + } g_value_copy (&prop_to_merge->values[i], &prop->values[i]); @@ -746,6 +771,11 @@ gtk_style_set_merge (GtkStyleSet *set, if (!G_IS_VALUE (&prop->default_value)) g_value_init (&prop->default_value, G_VALUE_TYPE (&prop_to_merge->default_value)); + else if (G_VALUE_TYPE (&prop->default_value) != G_VALUE_TYPE (&prop_to_merge->default_value)) + { + g_value_unset (&prop->default_value); + g_value_init (&prop->default_value, G_VALUE_TYPE (&prop_to_merge->default_value)); + } g_value_copy (&prop_to_merge->default_value, &prop->default_value); diff --git a/gtk/gtkstyleset.h b/gtk/gtkstyleset.h index 24f6b99871..6b828345ac 100644 --- a/gtk/gtkstyleset.h +++ b/gtk/gtkstyleset.h @@ -52,7 +52,8 @@ GType gtk_style_set_get_type (void) G_GNUC_CONST; /* Functions to register style properties */ void gtk_style_set_register_property (const gchar *property_name, - GType type); + GType type, + const GValue *default_value); gboolean gtk_style_set_lookup_property (const gchar *property_name, GType *type); -- 2.30.2